﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Vector3 = DDD.Vector3<float>;


namespace DDD {

    /// <summary>
    /// コリジョン構造体
    /// </summary>
    /// <remarks>
    /// コリジョン検出の結果をカプセル化します。
    /// <see cref="Physics3D.Collide"/>が呼ばれてコリジョン検出が実行されると
    /// 重なりあった<see cref="CollisionVolume"/>コンポーネントを持つ２つの物体は、
    /// 双方の<see cref="Component.OnCollisionEnter"/>が衝突結果を<dic>Collision</dic>を引数にして呼び出されます。
    /// ユーザーが<dic>Collision</dic>型をインスタンス化することはできず、
    /// 必ずエンジン側が作成したものを戻り値で受け取ります。
    /// </remarks>
    public struct Collision {

        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="x">衝突地点の座標のX</param>
        /// <param name="y">衝突地点の座標のY</param>
        /// <param name="z">衝突地点の座標のZ</param>
        /// <param name="nx">衝突地点の法線のX</param>
        /// <param name="ny">衝突地点の法線のY</param>
        /// <param name="nz">衝突地点の法線のZ</param>
        /// <param name="collider">衝突の相手</param>
        public Collision (float x, float y, float z, float nx, float ny, float nz, Node collider) : this(){
            this.Position = new Vector3 (x, y, z);
            this.Normal = new Vector3 (nx, ny, nz);
            this.Collider = collider;
        }

        /// <value>衝突位置</value>
        public Vector3 Position { get; private set; }

        /// <value>衝突法線</value>
        public Vector3 Normal { get; private set; }

        /// <value>衝突の相手</value>
        public Node Collider { get; private set; }

        /// <summary>
        /// 現在のオブジェクトの状態を表す文字列を返します。
        /// </summary>
 
        public override string ToString () {
            return string.Format("Collision : Position={0}, Normal={1}, Collider={2}", Position, Normal, Collider);
        }
    }
}
